package com.shangguigu.crud.controller;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.shangguigu.crud.bean.Employee;
import com.shangguigu.crud.bean.msg;
import com.shangguigu.crud.service.EmployeeService;

/**
 * 处理员工增删改查
 * 
 * @author 凌熬
 *
 */

@Controller
public class EmployeeController {
	@Autowired
	public EmployeeService employeeService;
	/**
	 * 员工更新方法
	 * @param employee
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/emp/{empId}",method = RequestMethod.PUT)
	public msg saveEmp(Employee employee) {
		System.out.println("更新方法的执行"+employee);
		employeeService.updateEmp(employee);
		return msg.success();
	}
	/**
	 * 按照员工id查询员工
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/emp/{id}",method = RequestMethod.GET)
	@ResponseBody
	public msg getEmpName_update(@PathVariable("id")Integer id) {
		Employee employee=employeeService.getEmpName_update(id);
		return msg.success().add("em", employee);
	}
	/**
	 * 校验是否和数据库有重复
	 * 
	 */
	@ResponseBody
	@RequestMapping("/checkuser")
	public msg chechuser(@RequestParam("empName")String empName) {
		//先判断用户名是否是合法的表达式
		String regx="(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]+$)";
		if(!empName.matches(regx)) {
			return msg.fail().add("va_msg", "2-5汉字或者6-16位中英文");
		}
		System.out.println("数据库用户名重复校验");
		//数据库用户名重复校验
		boolean b=employeeService.check(empName);
		if (b) {
			return msg.success();
		}else {
			return msg.fail().add("va_msg", "用户名不可用");
		}
		
		
	}
	
	/**
	 * 从模态框中保存数据到数据库	
	 */
	@RequestMapping(value = "/emp",method=RequestMethod.POST)
	@ResponseBody
	public msg saveEmp(@Valid Employee e,BindingResult result) {
		System.out.println("控制层开始保存的");
		if(result.hasErrors()) {
			//从模态矿中读取到后台的校验信息
			Map<String,Object> map =new HashMap<>();
			List<FieldError> fieldErrors = result.getFieldErrors();
			for (FieldError fieldError : fieldErrors) {
				System.out.println("错误的字段名"+fieldError.getField());
				System.out.println("错误的信息"+fieldError.getDefaultMessage());
				map.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
			return msg.fail().add("errorfields",map);
		}else {
			employeeService.saveEmp(e);
			return msg.success();
		}
		
		
		
	}
	
	/**
	 * 导入jackson包 ，负责将pageinfo对象转换成json字符串
	 * @param pn
	 * @param model
	 * @return
	 */
	@RequestMapping("/emps")
	@ResponseBody//把数据给json
	public msg  getjson(@RequestParam(value = "pn",defaultValue = "1")Integer pn) {
		System.out.println("控制层开始");
		// 分页查询每次显示的个数传入  紧跟的就是查询的结果  封装到pageinfo中，
		PageHelper.startPage(pn, 15);
		List<Employee> emps=employeeService.getAll();
		PageInfo page=new PageInfo(emps,5);
		return msg.success().add("pageInfo",page);
	}
	
	
	/**
	 * 分页查询
	 * 
	 * @return
	 */
	
	//@RequestMapping("/empss")
	public String getemps(@RequestParam(value="pn",defaultValue="1") Integer pn, Model model) {
		/**
		 * 这不是一个分页数据 所以要在pom中引入PagrHelper分页插件 要进入mybatis的全局配置中注册这个插件
		 * 在查询之前只需要在控制器中pageHepler.startpage(n,数据)
		 */
		System.out.println("控制层开始执行");
		// 分页查询每次显示的个数 传入
		PageHelper.startPage(pn,10); 
		//startPage紧跟的就是查询结果
		List<Employee> emps = employeeService.getAll();
		 // 查询结果显示完成之后 用PageInfo包装结果只需要将pageInfo交给页面
		// 详细的封装了详细的分页数据，包括我们查询出来的信息，每次连续显示的页数 
		 PageInfo page = new PageInfo(emps,5);
		model.addAttribute("pageInfo", page);
		
		return "list";
	}

}
